package jonggyuni.basic;

public class J16_Printer {

	public static void main(String[] args) {
		//인터페이스 활용하기
		
		
	}//main

	
}//class


class PrinterV2{	//값만 저장하는 클래스 //부모클래스
	private String model;
	private String maker;
	private String type;
	private int papers;
	private int remain;
	
	//Printer 클래스와 달리 메서드는 정의하지 않음
	//상속관계에 의해 부모클래스의 메서드가 무시당할 것 이므로 아예 만들지 않음
}

//모든 프린터가 기본적으로 제공해야 하는 표준 기능을 인터페이스로 작성
//interface가 선언된 메서드는 불완전하기 때문에 반드시 재정의 해줘야 한다.
interface PrinterV2Service{ 
	void print();
	int showRemain();// 잔량 정보표시
	
}

//PrinterV2 클래스와 PrinterV2Service 인터페이스를 이용해서 
//Inkjet, Laser 프린터 클래스 작성

class InkjetPrinterV2 extends PrinterV2 implements PrinterV2Service{
	
	@Override
	public void print() {
		System.out.println("잉크젯 프린터입니다!!");
	}
	@Override
	public int showRemain() {
		return 100;
	}
	
}

class LaserPrinterV2 extends PrinterV2 implements PrinterV2Service{
	
	@Override
	public void print() {
		System.out.println("레이저 프린터입니다!!");
	}
	
	//레이저 프린터에서는 제공하지 않는 기능이지만
	//인터페이스를 구현했으므로 어쩔수 없이 표시.
	//어쩔수 없이 showRemain 메서드 재정의 해야함.
	//즉, 필요없지만 약속에 의해 어거지로 작성함
	@Override
	public int showRemain() {
		return 0;
	}
}

//잉크젯/레이저 프린터 클래스를 작성하기 위해
//extends와 implements 예약어를 사용하는 것은
//왠지 복잡해 보임
//따라서, 이것을 간편하게 학정하기 위해 기본클래스개념을 도입함
//또, 특정 클래스에서 사용하지 않는 메서드 엠이도 물구하고 
//인터페이스 규칙상 장석해야하는 불편함도 존재
//예, inkjet : print(), showremain()제공
//예, laser : print()만 제공

interface PrinterV3Service{
	void print();
	int showRemain();
}

class PrinterV3 implements PrinterV3Service{
	private String model;
	private String maker;
	private String type;
	private int papers;
	private int remain;
	
	@Override
	public void print() {
		System.out.println("프린터입니다!");
	}
	
	@Override
	public int showRemain() {
		return 0;
	}
}

class InkjetPrinterV3 extends PrinterV3{
	public void print() {
		System.out.println("잉크젯 프린터입니다!");
		
	}
	
	@Override
	public int showRemain() {
		return 100;
	}
}

class LaserPrinterV3 extends PrinterV3{
	public void print() {
		System.out.println("레이져 프린터입니다!");
	}
}

//기본 클래스를 도입해서
//잉크젯/레이저 프린터클래스 작성시
//상당히 간편함을 알 수 있음
//또한, 인터페이스를 사용하더라도
//용도에 따라 메서드 작성을 취사 선택할 수 있음
































